perm filename ALLTLK.INS[2,LCS] blob sn#308322 filedate 1977-10-06 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00018 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	<Declaraions, etc.
C00004 00003	<MakeTable, Normalize
C00009 00004	<Leapfrog, bowset
C00011 00005	<SetFreq, SetAmp, SetNoise
C00013 00006	<Interpolate, numset
C00015 00007	<Prepare arrays
C00017 00008	<Formant Frequencies
C00021 00009	<Formant Amplitudes, etc
C00024 00010	<piano
C00027 00011	<vn1
C00033 00012	<vn2
C00039 00013	<Tlks
C00041 00014	<Tlks
C00043 00015	<Tlks
C00045 00016	<Tlkc
C00047 00017	<Tlkc
C00049 00018	<Tlkc
C00053 ENDMK
C⊗;
<Declaraions, etc.
OUTSPEC←"TALKER.SND/BYTESIZE=12/HEADER/PLAY/SAVE=512";
srate ← 25600; mag←512/srate; nchns←1;
EXTERNAL UNIT_GENERATOR shaper;

ARRAY
  ShapeTable(512), NormTable(512), HarmAmps(10);

VARIABLE 
  IYv,Iv,Ev,AEv,UHv,Av,OWv,Uv,OOv,ERv,Wv,Lv,Rv,Yv,
  Bc,Dc,Gc,Mc,Nc,NGc,Pc,Tc,Kc,Fc,THc,Sc,SHc,Vc,THEc,Zc,ZHc,
  EEv,SSc,LLV,LHV,I2V,VVC;

ARRAY
  Ramp(512), SineWave(512), AmpFunc (512);

SEG(Ramp);0 1 1 100
SEG(AmpFunc); 0,1 1,25 1,50 0,75 0,100;
SYNTH(SineWave); 1 1 999

ARRAY 
  FormA(64), FormB(64), FormC(64), FormD(64), SpeedD(64),
  AmpA(64),   AmpB(64),  AmpC(64),  AmpD(64);

VARIABLE
  /frmampA, /frmampB, /frmampC, ccr, Memory1, Index1, Index2, Index3;

ccr ←  10;
Memory1 ← 0;
<MakeTable, Normalize;
FUNCTION MakeTable(
    ARRAY F,ARRAY HarmAmps);

    BEGIN
      VARIABLE I,HarmNum,X,Y,Cur,Nxt,Temp,Amp,MaxHarm,MaxI;

      MaxI ← LENGTH(F)-1;         
      MaxHarm ← LENGTH(HarmAmps)-1;
      WHILE HarmAmps(MaxHarm)=0 DO MaxHarm ← MaxHarm-1;

      FOR I ← 0 STEP 1 UNTIL MaxI         
	DO BEGIN
	  X ← (I*2/MaxI)-1; Y ← 0;
	  Cur ← 1; Nxt ← X;       
	  FOR HarmNum ← 0 STEP 1 UNTIL MaxHarm
	    DO BEGIN
	      Amp ← HarmAmps[HarmNum];
	      IF Amp≠0 THEN Y ← Y+Amp*Cur;
	      Temp ← Nxt; 
	      Nxt ← 2*X*Nxt-Cur; 
	      Cur ← Temp;
	      END;
	  F[I] ← Y;
	  END;
      END;

FUNCTION Normalize(
   ARRAY Table);

    BEGIN 
      VARIABLE MaxShape,I,A,L;

      MaxShape ← 0; L←Length(Table)-1;
      FOR I←0 STEP 1 UNTIL L DO BEGIN
	A←ABS(Table[I]);
	If A>MaxShape Then MaxShape←A;
	END;
      FOR I←0 STEP 1 UNTIL L DO Table[I] ← (Table[I]/MaxShape);

      END;
<Leapfrog, bowset;
FUNCTION LeapFrog(FormntFq,FundamFq,EvnFq,OddFq,EvnAmp,OddAmp,ScaAmp);

  BEGIN 
    VARIABLE FqRatio, LowRatio, Diff;

    FqRatio ← FormntFq / FundamFq;
    LowRatio ← INT(FqRatio);
    Diff ← FqRatio - LowRatio;  
    If LowRatio - INT(LowRatio / 2) * 2 = 0
      THEN BEGIN      < LowRatio is Even;
	EvnAmp ← ScaAmp * (1 - Diff);
	OddAmp ← ScaAmp * Diff;
	EvnFq ← LowRatio * FundamFq;
	OddFq ← EvnFq + FundamFq;
	END
      ELSE BEGIN      < LowRatio is Odd;
	OddAmp ← ScaAmp * (1 - Diff);
	EvnAmp ← ScaAmp * Diff;
	OddFq ← LowRatio * FundamFq;
	EvnFq ← OddFq + FundamFq;
	END;

    END;

FUNCTION Bowset (b,m1,dt,at,r,d);
	Begin

    IF b = 0
	THEN IF m1 > 0.08
	    THEN BEGIN
		dt ← .7; at ← .2;        
      	    END
	    ELSE BEGIN
		dt ← .7; at ← .05; r←0;          
	    END 
	ELSE        
    	    IF m1 > .05
		THEN BEGIN
		    dt ← .05; at ← .2;        
 		END
		ELSE BEGIN
		    dt ← .05; at ← .05; r ← 0;            
		END;

    m1 ← dt;

    IF at + dt ≥ d
	THEN BEGIN
	    at ← d * at;
            dt ← d * dt;
            IF at≤.05 THEN at ← d - dt - .01;
	END;

	end;

<SetFreq, SetAmp, SetNoise;
FUNCTION SetFreq (pf, pp, a1,a2,b1,b2,c1,c2, bigf1,bigf2, Memory1, I,
			ARRAY FA, ARRAY FB, ARRAY FC);
	BEGIN

 	a1  ← a2;  a2  ← FA[pp] * mag;
  	b1  ← b2;  b2  ← FB[pp] * mag;
 	c1  ← c2;  c2  ← FC[pp] * mag;
 	bigf1 ← bigf2; bigf2 ← pf * mag;
	I ← 1 - pf / 600;
 	IF I < 0 THEN I ← 0;
 	
	IF Memory1 < 1 Then Begin
 		a1  ← a2;
 		b1  ← b2;
 		c1  ← c2;
 		bigf1 ← bigf2;
	  	End;
	 End;

FUNCTION SetAmp (pa, pp,pf,a1,a2,b1,b2,c1,c2, biga1,biga2, Memory1, 
			ARRAY AA, ARRAY AB, ARRAY AC);
	BEGIN
	VARIABLE Mult1;	
        Mult1 ← 1;
	IF pf > 300 Then Mult1 ← 300 / pf;

 	a1  ← a2;  a2  ← AA[pp];
  	b1  ← b2;  b2  ← AB[pp] * Mult1;
 	c1  ← c2;  c2  ← AC[pp] * Mult1;
 	biga1 ← biga2; biga2 ← pa;
 	
 	IF Memory1 < 1 Then Begin
 		a1  ← a2;
 		b1  ← b2;
 		c1  ← c2;
 		biga1 ← 0;
	  	End;
	 End;

FUNCTION SetNoise(pd,pp,pm,n1,n2,i,inc,M1,
			ARRAY FD, ARRAY AD, ARRAY SD);
	BEGIN
	VARIABLE s;
	n1 ← FD[pp] * mag;
	n2 ← AD[pp] * mag;
	i ← 0;

   	IF M1 < 1 THEN s ← 1;
	inc ← s / (srate * pd);
	s ← SD[pp];
	M1 ← pm;
	PRINT P5," ";
	end;
<Interpolate, numset;
FUNCTION Interpolate(FA,OFA,NFA,FB,OFB,NFB,FC,OFC,NFC,AA,OAA,NAA,
			AB,OAB,NAB,AC,OAC,NAC,VD,OVD,NVD,VR,OVR,NVR,Intrp);
	BEGIN

  IF Intrp < 1 Then Begin

  FA ← OFA + Intrp * (NFA - OFA);
  FB ← OFB + Intrp * (NFB - OFB);
  FC ← OFC + Intrp * (NFC - OFC);
  AA ← OAA + Intrp * (NAA - OAA);
  AB ← OAB + Intrp * (NAB - OAB);
  AC ← OAC + Intrp * (NAC - OAC);

  VD ← OVD + Intrp * (NVD - OVD);
  VR ← OVR + Intrp * (NVR - OVR);

	END 

  ELSE Begin
	
  FA ← NFA;
  FB ← NFB;
  FC ← NFC;
  AA ← NAA;
  AB ← NAB;
  AC ← NAC;
  VD ← NVD;
  VR ← NVR;
  END;

END;
	
Function NumSet (Vr,Va,sf,f,dl,s1,r,i1,i2,i3,im,lf);
	Begin

    VR ← 5.25 + RAND * .75;
    VA ← .006 + RAND * .001;

    SF ← F * MAG;
    DL ← 1000 / (F);
    IF S1 = 0 THEN r ← .1;

    I1 ← 7.5 * Im / LF;      
    I2 ← 5 / SQRT(F);           
    I3 ← IM * 30*(8.5-(LF))/F;
	end;
<Prepare arrays;
FOR I ← 0 STEP 1 UNTIL LENGTH(HarmAmps)-1 DO HarmAmps[I] ← 0;
FOR I ← 0 STEP 1 UNTIL LENGTH(NormTable)-1 DO NormTable[I] ← 1;
FOR I ← 0 STEP 1 UNTIL LENGTH(AmpD)-1 DO AmpD[I] ← 400;
FOR I ← 0 STEP 1 UNTIL 31 DO AmpA[I] ← .8;
FOR I ← 0 STEP 1 UNTIL 31 DO AmpB[I] ← .17;
FOR I ← 0 STEP 1 UNTIL 31 DO AmpC[I] ← .03;
FOR I ← 0 STEP 1 UNTIL 31 DO FormD[I] ← 0;
FOR I ← 0 STEP 1 UNTIL 31 DO SpeedD[I] ← 1;

FOR I ← 33 STEP 1 UNTIL 63 DO AmpA[I] ← 0;
FOR I ← 33 STEP 1 UNTIL 63 DO AmpB[I] ← .25;
FOR I ← 33 STEP 1 UNTIL 63 DO AmpC[I] ← .15;
FOR I ← 33 STEP 1 UNTIL 63 DO FormD[I] ← 15;
FOR I ← 33 STEP 1 UNTIL 63 DO SpeedD[I] ← 10;

HarmAmps[0] ← 1;
HarmAmps[1] ← .25;
HarmAmps[2] ← -.11;
HarmAmps[3] ← -.06;
HarmAmps[4] ← .03;

MakeTable(ShapeTable,HarmAmps);
Normalize(ShapeTable);
<Formant Frequencies;
IYv ← 0;	FormA[00]←270;	FormB[00]←2290;	FormC[00]←3010;
Iv  ← 1;	FormA[01]←390;	FormB[01]←1990;	FormC[01]←2550;
Ev  ← 2;	FormA[02]←530;	FormB[02]←1840;	FormC[02]←2480;
AEv ← 3;	FormA[03]←660;	FormB[03]←1720;	FormC[03]←2410;
UHv ← 4;	FormA[04]←520;	FormB[04]←1190;	FormC[04]←2390;
Av  ← 5;	FormA[05]←730;	FormB[05]←1090;	FormC[05]←2440;
OWv ← 6;	FormA[06]←570;	FormB[06]←840;	FormC[06]←2410;
Uv  ← 7;	FormA[07]←440;	FormB[07]←1020;	FormC[07]←2240;
OOv ← 8;	FormA[08]←300;	FormB[08]←870;	FormC[08]←2240;
ERv ← 9;	FormA[09]←490;	FormB[09]←1350;	FormC[09]←1690;
Wv ← 10;	FormA[10]←300;	FormB[10]←610;	FormC[10]←2200;
Lv ← 11;	FormA[11]←380;	FormB[11]←880;	FormC[11]←2575;
Rv ← 12;	FormA[12]←420;	FormB[12]←1300;	FormC[12]←1600;
Yv ← 13;	FormA[13]←300;	FormB[13]←2200;	FormC[13]←3065;
EEv ← 14;	FormA[14]←260;	FormB[14]←3500;	FormC[14]←3800;
LHV ← 15;	FormA[15]←280;	FormB[15]←1450;	FormC[15]←1600;
LV ← 16;	FormA[16]←300;	FormB[16]←1300;	FormC[16]←3000;
I2V ← 17;	FormA[17]←350;	FormB[17]←2300;	FormC[17]←3340;

Bc ← 34;	FormA[34]←200;	FormB[34]←800;	FormC[34]←1750;
Dc ← 35;	FormA[35]←300;	FormB[35]←1700;	FormC[35]←2600;
Gc ← 36;	FormA[36]←250;	FormB[36]←2350;	FormC[36]←2000;
Mc ← 37;	FormA[37]←280;	FormB[37]←900;	FormC[37]←2200;
Nc ← 38;	FormA[38]←280;	FormB[38]←1700;	FormC[38]←2600;
NGc ← 39;	FormA[39]←280;	FormB[39]←2300;	FormC[39]←2750;
Pc ← 40;	FormA[40]←300;	FormB[40]←800;	FormC[40]←1750;
Tc ← 41;	FormA[41]←200;	FormB[41]←1700;	FormC[41]←2600;
Kc ← 42;	FormA[42]←350;	FormB[42]←1350;	FormC[42]←2000;
Fc ← 43;	FormA[43]←175;	FormB[43]←900;	FormC[43]←4400;
THc ← 44;	FormA[44]←200;	FormB[44]←1400;	FormC[44]←2200;
Sc ← 45;	FormA[45]←200;	FormB[45]←1300;	FormC[45]←2500;
SHc ← 46;	FormA[46]←200;	FormB[46]←1800;	FormC[46]←2000;
Vc ← 47;	FormA[47]←175;	FormB[47]←1100;	FormC[47]←2400;
THEc ← 48;	FormA[48]←200;	FormB[48]←1600;	FormC[48]←2200;
Zc ← 49;	FormA[49]←200;	FormB[49]←1300;	FormC[49]←2500;
ZHc ← 50;	FormA[50]←175;	FormB[50]←1800;	FormC[50]←2000;
SSc ← 51;	FormA[51]←900;	FormB[51]←2400;	FormC[51]←3800;
VVC ← 52;	FormA[52]←565;	FormB[52]←1045;	FormC[52]←2400;
<Formant Amplitudes, etc;
AmpA[34]←.1;	AmpB[34]← .2;	AmpC[34]← .1;    AmpD[34]←10; FormD[34]←10;
AmpA[35]←0;	AmpB[35]←.1;	AmpC[35]←.15;	AmpD[35]←400; FormD[35]←15;
AmpA[36]←.8;	AmpB[36]←.15;	AmpC[36]←.05;   AmpD[36]←400; FormD[36]←15;
AmpA[37]←0;	AmpB[37]←0;	AmpC[37]←0;	AmpD[37]←0;   FormD[37]←15;
AmpA[38]←0;	AmpB[38]←0;	AmpC[38]←0;     AmpD[38]←0;   FormD[38]←15;
AmpA[39]←0;	AmpB[39]←0;	AmpC[39]←0;     AmpD[39]←0;   FormD[39]←15;
AmpA[40]←.25;	AmpB[40]← 0;	AmpC[40]← 0;    AmpD[40]←400; FormD[40]←10;
AmpA[41]←0;	AmpB[41]← 0;	AmpC[41]← .1;   AmpD[41]←400; FormD[41]←0;
AmpA[42]←.8;	AmpB[42]←.15;	AmpC[42]←.05;   AmpD[42]←400; FormD[42]←15;
AmpA[43]←.15;	AmpB[43]← 0;	AmpC[43]← 0;    AmpD[43]←400; FormD[43]←15;
AmpA[44]←.25;	AmpB[44]← .1;	AmpC[44]← .05;    AmpD[44]←400; FormD[44]←15;
AmpA[45]←0;	AmpB[45]← .1;	AmpC[45]←.05;   AmpD[45]←400; FormD[45]←10;
AmpA[46]←0;	AmpB[46]←.25;	AmpC[46]←.05;   AmpD[46]←400; FormD[46]←15;
AmpA[47]←.2;	AmpB[47]←.25;	AmpC[47]←.15;   AmpD[47]←400; FormD[47]←15;
AmpA[48]←.25;	AmpB[48]← .1;	AmpC[48]← .05;    AmpD[48]←400; FormD[48]←15;
AmpA[49]←.3;	AmpB[49]← .2;	AmpC[49]←.1;    AmpD[49]←150; FormD[49]←5;
AmpA[50]←.3;	AmpB[50]← .2;	AmpC[50]←.1;    AmpD[50]←150; FormD[50]←5;
AmpA[51]←0;	AmpB[51]← .1;	AmpC[51]←.05;   AmpD[51]←400; FormD[51]←10;
AmpA[52]←.2;	AmpB[52]←.25;	AmpC[52]←.15;   AmpD[52]←400; FormD[52]←15;

SpeedD[35]←10;
SpeedD[36]←10;
SpeedD[37]←5;
SpeedD[38]←1;
SpeedD[39]←1;
SpeedD[41]←10;
SpeedD[42]←10;
SpeedD[44]←3;
SpeedD[45]←1;
SpeedD[46]←1;
SpeedD[48]←3;
SpeedD[51]←1;
<piano
ARRAY GlissFunc, DecayFunc, AmplFunc (512);
SEG(AMPLFUNC); 1,1 1,95 0,100;
SEG(GlissFunc);0,1 1,50 0,100;                       
SEG(DecayFunc);1,1 .6,5 .3,10 .15,25 .07,50 0,100;

Variable Pmag, /Penv, freqv2,/adder;
INSTRUMENT PIANO;
VARIABLE AMPL, DECAYLENGTH, FREQ,              
	PEDAL, DURATION, STRETCH,INDEX1, INDEX2,                    
	/DECAY, /DAMPER, /MOD1, /MOD2, /STR1;
I_ONLY BEGIN
    DURATION ← P2;         			< Set in play file 
    freqv2←FREQ ← P3;   				< Set in play file 
    AMPL ← P4;  			        < Set in play file

    PMag ← Freq * Mag;
    INDEX1 ← 15 * (8 - ALOG(FREQ)) / (ALOG(FREQ) * ALOG(FREQ));   
    INDEX2 ← 75 * (8 - ALOG(FREQ)) / FREQ;
    DECAYLENGTH ← 10 * SQRT(AMPL) / SQRT(FREQ);     
    STRETCH  ←  FREQ/200;  
END;  
Penv ← (EXPEN[10] (1, MAG * 10 / DECAYLENGTH, DECAYFUNC) ) *
        (OSCIL[10] (1, MAG * 10 / P2, AMPLFUNC));
adder ←	(Expen[10] (1, Mag * 10 / p2, ampfunc));
MOD1 ← OSCIL (PMag * INDEX1, (FREQ + STRETCH) * MAG, SINEWAVE);	      
MOD2 ← OSCIL (PMag * INDEX2, 4 * (FREQ + STRETCH) * MAG, SINEWAVE);	      
STR1 ← ZOSCIL ((Penv - .5 * adder) * ampl, PMag + MOD1 + MOD2, SINEWAVE);	
<DSIG ← DSIG + STR1 * .05;
OUTA ← OUTA + STR1;       
END;
<vn1;
Variable /NewMag0, /env0, Freqv1, durv1;
INSTRUMENT VN1; 
VARIABLE Reset1, racket, OtherFreq, /Gliss, Distance, Stereo,
	freq,Amp1, Amp2, Duration, AttackTime, DecayTime, mem1,
        Index1, Index2, Index3, ScFreq, DecayLength, Switch1, Switch2,
	/Mod1, /Mod2, /Mod3, /Att, /Vibrato, IMult, /Snd,
	/Flutter, VibRate, VibAmp, /AmpRamp, /Decay, VibSwitch, LogFreq,
        GlissLength, Bowing, DecayCall, VibCall, GlissCall, RampCall;
    mem1←1;

I_ONLY BEGIN
    durv1 ← Duration ← P2;    
    freq ← Freqv1 ← P3;        
    Amp1 ← P4;         
    Amp2 ← P5;       		 <end volume if Bowing = 1.
    OtherFreq ← P6;   		 <Sets endpoint of Gliss.
    Switch1 ← P14;  	  	 <1=ARCO, 0=PIZZ. 
    Switch2 ← 1 - Switch1;
    IMult ← P7 - (Switch2 / 4);
    VibSwitch ← P8;		 <1 = Vib. 0 = no Vib.
    Bowing ← P9;     		 <0=Detached, 1=Legato.
    Distance ← P10;   
    Stereo ← P11;     		 <0=All OUTB, 1=All OUTA.
    racket ← P12;
    GlissLength ← P13;		 <if OtherFreq ≠ freq, sets amount of glissando
    LogFreq ← Alog(freq);

    DecayCall ← VibCall ← RampCall ← GlissCall ← 20;
    IF Amp1 = Amp2 THEN RampCall ← SRATE;
    IF freq = OtherFreq THEN GlissCall ← SRATE;
    IF VibSwitch = 0 Then VibCall ← SRATE;
    IF Switch1 = 1 Then DecayCall ← SRATE;
Bowset (bowing,mem1,decaytime,attacktime,racket,duration);
NumSet(VibRate,VibAmp,ScFreq,Freq,DecayLength,Switch1,racket,
	Index1,Index2,Index3,IMult,LogFreq);
END;
Decay ← Switch1 + EXPEN[DecayCall] (Switch2, MAG * 20 / DecayLength, DecayFunc);
env0 ← Switch2 + 
LINEN[20] (Switch1, AttackTime/20, DecayTime/20, Duration/20, Ampfunc, Reset1 ← 0);	 
AmpRamp ← Amp1 + NOSCIL[RampCall] (Amp2 - Amp1, 20 * (MAG / Duration), Ramp);
Gliss ← freq + EXPEN[GlissCall] (OtherFreq - freq, 20 * MAG/GlissLength, GlissFunc);
Flutter ← RANDI[VibCall] (1, 200 * MAG);				
Vibrato ← NOSCIL[VibCall] (env0, VibRate * MAG * 20, Sinewave);		
Att ← 1 - EXPEN[20](1, MAG*640, Ramp);

newmag0 ← (1 + Flutter * .005) * (1 + Vibrato * VibAmp) * (1 +
	RANDI (racket *  Att, 2000 * MAG)) * Gliss * MAG;                                

Mod1 ← NOSCIL (Decay * ScFreq * (Att+Index1), newmag0, Sinewave);	
Mod2 ← NOSCIL (Decay * ScFreq * (Att+Index2), 4 * newmag0, Sinewave);
Mod3 ← NOSCIL (Decay * ScFreq * (Att+Index3), 3 * newmag0, Sinewave); 
Snd ← ZOSCIL (Decay * env0 * ampRamp, newmag0 + Mod1 + Mod2 + Mod3, Sinewave);	

<DSIG ← DSIG + Snd * .05;
OUTA ← OUTA + Snd * Stereo / Distance;          
<OUTB ← OUTB + Snd * (1 - Stereo) / Distance;          
END;
<vn2;
Variable /NewMag1, /env1, Freqv2, durv2;
INSTRUMENT VN2; 
VARIABLE Reset2, racket, OtherFreq, /Gliss, Distance, Stereo,
	freq,Amp1, Amp2, Duration, AttackTime, DecayTime, mem2,
        Index1, Index2, Index3, ScFreq, DecayLength, Switch1, Switch2,
	/Mod1, /Mod2, /Mod3, /Att, /Vibrato, IMult, /Snd,
	/Flutter, VibRate, VibAmp, /AmpRamp, /Decay, VibSwitch, LogFreq,
        GlissLength, Bowing, DecayCall, VibCall, GlissCall, RampCall;

    mem2←1;
I_ONLY BEGIN
    durv2 ← Duration ← P2;    
    freq ← Freqv2 ← P3;        
    Amp1 ← P4;         
    Amp2 ← P5;       		 <end volume if Bowing = 1.
    OtherFreq ← P6;   		 <Sets endpoint of Gliss.
    Switch1 ← P14;  	  	 <1=ARCO, 0=PIZZ. 
    Switch2 ← 1 - Switch1;
    IMult ← P7 - (Switch2 / 4);
    VibSwitch ← P8;		 <1 = Vib. 0 = no Vib.
    Bowing ← P9;     		 <0=Detached, 1=Legato.
    Distance ← P10;   
    Stereo ← P11;     		 <0=All OUTB, 1=All OUTA.
    racket ← P12;
    GlissLength ← P13;		 <if OtherFreq ≠ Freq, sets amount of glissando
    LogFreq ← Alog(Freq);

    DecayCall ← VibCall ← RampCall ← GlissCall ← 20;
    IF Amp1 = Amp2 THEN RampCall ← SRATE;
    IF Freq = OtherFreq THEN GlissCall ← SRATE;
    IF VibSwitch = 0 Then VibCall ← SRATE;
    IF Switch1 = 1 Then DecayCall ← SRATE;

Bowset (bowing,mem2,decaytime,attacktime,racket,duration);
NumSet(VibRate,VibAmp,ScFreq,Freq,DecayLength,Switch1,racket,
	Index1,Index2,Index3,IMult,LogFreq);
END;
Decay ← Switch1 + EXPEN[DecayCall] (Switch2, MAG * 20 / DecayLength, DecayFunc);
env1 ← Switch2 + 
LINEN[20] (Switch1, AttackTime/20, DecayTime/20, Duration/20, Ampfunc, Reset2 ← 0);	 
AmpRamp ← Amp1 + NOSCIL[RampCall] (Amp2 - Amp1, 20 * (MAG / Duration), Ramp);
Gliss ← Freq + EXPEN[GlissCall] (OtherFreq - Freq, 20 * MAG/GlissLength, GlissFunc);
Flutter ← RANDI[VibCall] (1, 200 * MAG);				
Vibrato ← NOSCIL[VibCall] (env1, VibRate * MAG * 20, Sinewave);		
Att ← 1 - EXPEN[20](1, MAG*640, Ramp);

newmag1 ← (1 + Flutter * .005) * (1 + Vibrato * VibAmp) * (1 +
	RANDI (racket *  Att, 2000 * MAG)) * Gliss * MAG;                                

Mod1 ← NOSCIL (Decay * ScFreq * (Att+Index1), newmag1, Sinewave);	
Mod2 ← NOSCIL (Decay * ScFreq * (Att+Index2), 4 * newmag1, Sinewave);
Mod3 ← NOSCIL (Decay * ScFreq * (Att+Index3), 3 * newmag1, Sinewave); 
Snd ← ZOSCIL (Decay * env1 * ampRamp, newmag1 + Mod1 + Mod2 + Mod3, Sinewave);	

<DSIG ← DSIG + Snd * .05;
OUTA ← OUTA + Snd * Stereo / Distance;          
<OUTB ← OUTB + Snd * (1 - Stereo) / Distance;          
END;
<Tlks;
VARIABLE 
  /SigAmp0, /TlkFrq0,
  /FrFrqA0, /FrFrqB0, /FrFrqC0;

INSTRUMENT TLKS1;

  VARIABLE
    /Xciter, /Driver,
    /EvnAmpA, /OddAmpA, /EvnFrqA, /OddFrqA, /FrmSigA,
    /EvnAmpB, /OddAmpB, /EvnFrqB, /OddFrqB, /FrmSigB,
    /EvnAmpC, /OddAmpC, /EvnFrqC, /OddFrqC, /FrmSigC;

tlkfrq0 ← newmag0;
  Xciter ← CZOSCIL(1, TlkFrq0, sinewave);
  Driver ← SHAPER(ShapeTable, NormTAble, Xciter, Index1);

  VALUE[ccr](leapfrog(
      FrFrqA0, TlkFrq0, EvnFrqA, OddFrqA, EvnAmpA, OddAmpA, FrmAmpA));
  FrmSigA ← NOSCIL(EvnAmpA, EvnFrqA , sinewave) + 
	    NOSCIL(OddAmpA, OddFrqA , sinewave);

  VALUE[ccr](leapfrog(
      FrFrqB0, TlkFrq0, EvnFrqB, OddFrqB, EvnAmpB, OddAmpB, FrmAmpB));
  FrmSigB ← NOSCIL(EvnAmpB, EvnFrqB , sinewave) +
            NOSCIL(OddAmpB, OddFrqB , sinewave);

  VALUE[ccr](leapfrog(
      FrFrqC0, TlkFrq0, EvnFrqC, OddFrqC, EvnAmpC, OddAmpC, FrmAmpC));
  FrmSigC ← NOSCIL(EvnAmpC, EvnFrqC , sinewave) +  
            NOSCIL(OddAmpC, OddFrqC , sinewave);
  OUTA ← OUTA + Driver * env0 * SigAmp0 * (FrmSigA + FrmSigB + FrmSigC);
  end;
<Tlks;
VARIABLE 
  /SigAmp1, /tlkfrq1,
  /FrFrqA1, /FrFrqB1, /FrFrqC1;

INSTRUMENT TLKS2;

  VARIABLE
    /Xciter, /Driver,
    /EvnAmpA, /OddAmpA, /EvnFrqA, /OddFrqA, /FrmSigA,
    /EvnAmpB, /OddAmpB, /EvnFrqB, /OddFrqB, /FrmSigB,
    /EvnAmpC, /OddAmpC, /EvnFrqC, /OddFrqC, /FrmSigC;

  tlkfrq1 ← newmag1;
  Xciter ← CZOSCIL(1, tlkfrq1, sinewave);
  Driver ← SHAPER(ShapeTable, NormTAble, Xciter, Index2);

  VALUE[ccr](leapfrog(
      FrFrqA1, tlkfrq1, EvnFrqA, OddFrqA, EvnAmpA, OddAmpA, FrmAmpA));
  FrmSigA ← NOSCIL(EvnAmpA, EvnFrqA , sinewave) + 
	    NOSCIL(OddAmpA, OddFrqA , sinewave);

  VALUE[ccr](leapfrog(
      FrFrqB1, tlkfrq1, EvnFrqB, OddFrqB, EvnAmpB, OddAmpB, FrmAmpB));
  FrmSigB ← NOSCIL(EvnAmpB, EvnFrqB , sinewave) +
            NOSCIL(OddAmpB, OddFrqB , sinewave);

  VALUE[ccr](leapfrog(
      FrFrqC1, tlkfrq1, EvnFrqC, OddFrqC, EvnAmpC, OddAmpC, FrmAmpC));
  FrmSigC ← NOSCIL(EvnAmpC, EvnFrqC , sinewave) +  
            NOSCIL(OddAmpC, OddFrqC , sinewave);
  OUTA ← OUTA + Driver * env1 * SigAmp1 * (FrmSigA + FrmSigB + FrmSigC);
  end;
<Tlks;
VARIABLE 
  /SigAmp2, /tlkfrq2,
  /FrFrqA2, /FrFrqB2, /FrFrqC2;

INSTRUMENT TLKS3;

  VARIABLE
    /Xciter, /Driver,
    /EvnAmpA, /OddAmpA, /EvnFrqA, /OddFrqA, /FrmSigA,
    /EvnAmpB, /OddAmpB, /EvnFrqB, /OddFrqB, /FrmSigB,
    /EvnAmpC, /OddAmpC, /EvnFrqC, /OddFrqC, /FrmSigC;

  tlkfrq2 ← Pmag;
  Xciter ← CZOSCIL(1, tlkfrq2, sinewave);
  Driver ← SHAPER(ShapeTable, NormTAble, Xciter, Index3);

  VALUE[ccr](leapfrog(
      FrFrqA2, tlkfrq2, EvnFrqA, OddFrqA, EvnAmpA, OddAmpA, FrmAmpA));
  FrmSigA ← NOSCIL(EvnAmpA, EvnFrqA , sinewave) + 
	    NOSCIL(OddAmpA, OddFrqA , sinewave);

  VALUE[ccr](leapfrog(
      FrFrqB2, tlkfrq2, EvnFrqB, OddFrqB, EvnAmpB, OddAmpB, FrmAmpB));
  FrmSigB ← NOSCIL(EvnAmpB, EvnFrqB , sinewave) +
            NOSCIL(OddAmpB, OddFrqB , sinewave);

  VALUE[ccr](leapfrog(
      FrFrqC2, tlkfrq2, EvnFrqC, OddFrqC, EvnAmpC, OddAmpC, FrmAmpC));
  FrmSigC ← NOSCIL(EvnAmpC, EvnFrqC , sinewave) +  
            NOSCIL(OddAmpC, OddFrqC , sinewave);
  OUTA ← OUTA + Driver * (penv * adder) * SigAmp2 * (FrmSigA + FrmSigB + FrmSigC);
  end;
<Tlkc;
INSTRUMENT TLKC1;

  VARIABLE
   /Intrp, Increment, OldFrqF, NewFrqF, OldAmpF, NewAmpF,
    OldFrqA, NewFrqA, OldFrqB, NewFrqB, OldFrqC, NewFrqC,
    OldAmpA, NewAmpA, OldAmpB, NewAmpB, OldAmpc, NewAmpC,
    /Noise, NoiAmp, NoiAgi;

  I_ONLY BEGIN
<   p5 ← INT(Rand * 6 + 6);
    SetFreq(freqv1, p5, 
	    OldFrqA, NewFrqA, OldFrqB, NewFrqB, 
	    OldFRqC, NewFrqC, OldFrqF, NewFrqF, 
	    Memory1, Index1, FormA, FormB, FormC);

    SetAmp(p4, p5, Freqv1,
	   OldAmpA, NewAmpA, OldAmpB, NewAmpB, 
	   OldAmpC, NewAmpC, OldAmpF, NewAmpF, 
	   Memory1, AmpA, AmpB, AmpC);

    SetNoise(p2, p5, 2,
	   NoiAmp, Noiagi, intrp, increment, Memory1,
	   FormD, AmpD, SpeedD);
end;
Intrp ← Intrp + Increment;
VALUE[ccr](Interpolate( FrFrqA0,OldFrqA,NewFrqA,
			FrFrqB0,OldFrqB,NewFrqB,
			FrFrqC0,OldFrqC,NewFrqC,
			FrmampA,OldAmpA,NewampA,
			FrmampB,OldAmpB,NewAmpB,
			FrmampC,OldAmpC,NewAmpC,
			TlkFrq0,OldFrqF,NewFrqF,
			SigAmp0,OldAmpF,NewAmpF,Intrp));
Noise ← RANDH(noiamp, noiagi);  
END;

<Tlkc;
INSTRUMENT TLKC2;

  VARIABLE
   /Intrp, Increment, OldFrqF, NewFrqF, OldAmpF, NewAmpF,
    OldFrqA, NewFrqA, OldFrqB, NewFrqB, OldFrqC, NewFrqC,
    OldAmpA, NewAmpA, OldAmpB, NewAmpB, OldAmpc, NewAmpC,
    /Noise, NoiAmp, NoiAgi;

  I_ONLY BEGIN
<<  P5 ← INT(64 + 64*rand);
<   If p5 > 17 THEN If p5 < 34 Then p5 ← INT(Rand * 4 + 4);
<   If p5 > 52 THEN p5 ← INT(Rand * 4 + 4);
    SetFreq(freqv1, p5, 
	    OldFrqA, NewFrqA, OldFrqB, NewFrqB, 
	    OldFRqC, NewFrqC, OldFrqF, NewFrqF, 
	    Memory1, Index2, FormA, FormB, FormC);

    SetAmp(p4, p5, freqv1,
	   OldAmpA, NewAmpA, OldAmpB, NewAmpB, 
	   OldAmpC, NewAmpC, OldAmpF, NewAmpF, 
	   Memory1, AmpA, AmpB, AmpC);

    SetNoise(DURV2, p5, 0,
	   NoiAmp, Noiagi, intrp, increment, Memory1,
	   FormD, AmpD, SpeedD);
end;
Intrp ← Intrp + Increment;
VALUE[ccr](Interpolate( FrFrqA1,OldFrqA,NewFrqA,
			FrFrqB1,OldFrqB,NewFrqB,
			FrFrqC1,OldFrqC,NewFrqC,
			FrmampA,OldAmpA,NewampA,
			FrmampB,OldAmpB,NewAmpB,
			FrmampC,OldAmpC,NewAmpC,
			TlkFrq1,OldFrqF,NewFrqF,
			SigAmp1,OldAmpF,NewAmpF,Intrp));
Noise ← RANDH(noiamp, noiagi);  
END;

<Tlkc;
INSTRUMENT TLKC3;

  VARIABLE
   /Intrp, Increment, OldFrqF, NewFrqF, OldAmpF, NewAmpF,
    OldFrqA, NewFrqA, OldFrqB, NewFrqB, OldFrqC, NewFrqC,
    OldAmpA, NewAmpA, OldAmpB, NewAmpB, OldAmpc, NewAmpC,
    /Noise, NoiAmp, NoiAgi;

  I_ONLY BEGIN
    P5 ← INT(RAND * 6 + 6);
    SetFreq(freqv2, p5, 
	    OldFrqA, NewFrqA, OldFrqB, NewFrqB, 
	    OldFRqC, NewFrqC, OldFrqF, NewFrqF, 
	    Memory1, Index3, FormA, FormB, FormC);
    Index3 ← 1;

    SetAmp(p4, p5, freqv2,
	   OldAmpA, NewAmpA, OldAmpB, NewAmpB, 
	   OldAmpC, NewAmpC, OldAmpF, NewAmpF, 
	   Memory1, AmpA, AmpB, AmpC);

    SetNoise(p2, p5, 2,
	   NoiAmp, Noiagi, intrp, increment, Memory1,
	   FormD, AmpD, SpeedD);
end;
Intrp ← Intrp + Increment;
VALUE[ccr](Interpolate( FrFrqA2,OldFrqA,NewFrqA,
			FrFrqB2,OldFrqB,NewFrqB,
			FrFrqC2,OldFrqC,NewFrqC,
			FrmampA,OldAmpA,NewampA,
			FrmampB,OldAmpB,NewAmpB,
			FrmampC,OldAmpC,NewAmpC,
			TlkFrq2,OldFrqF,NewFrqF,
			SigAmp2,OldAmpF,NewAmpF,Intrp));
END;